﻿// Пример одномерных индексаторов
// Добавлена перегрузка индексаторов. Ввели тип данных double как индекс
using System;

class OneDemensionalIndexersDemo
{
    public static void _Main()
    {
        SafeFail sf = new SafeFail(8);
        for (int i = 1; i < 10; i++)
        {
            sf[i - 1] = i;
        }

        // Пример double-индексов
        sf[2.2] = 56;
        sf[5.6] = 112;

        for (int i = 0; i < sf.Length + 3; i++)
        {
            sf.Show(i);
        }

        sf.Show(12);

        
        Console.ReadLine();
    }
}

class SafeFail
{
    int[] a;
    public int Length;

    public SafeFail(int cnt)
    {
        a = new int[cnt];
        Length = cnt;
    }

    public int this[int index]
    {
        get 
        {
            if ((index >= 0) && (index < Length))
            {
                return a[index];
            }
            else
            {
                Console.WriteLine("Ошибка в получении данных");
                return 0;
            }
        }

        set 
        {
            if ((index >= 0) && (index < Length))
            {
                a[index] = value;
            }
            else
            {
                Console.WriteLine("Ошибка в установке данных");
            }
        }
    }

    // Перегрузка индексатора
    public int this[double index]
    {
        get
        {
            // Округляем значение
            if ((index - (int)index) > 0.5) index = (int)index + 1;
            else index = (int)index;


            if ((index >= 0) && (index < Length))
            {
                return a[(int)index];
            }
            else
            {
                Console.WriteLine("Ошибка в получении данных");
                return 0;
            }
        }

        set
        {
            // Округляем значение
            if ((index - (int)index) > 0.5) index = (int)index + 1;
            else index = (int)index;

            if ((index >= 0) && (index < Length))
            {
                a[(int)index] = value;
            }
            else
            {
                Console.WriteLine("Ошибка в установке данных");
            }
        }

    }
    public void Show(int index)
    {
        if ((index >= 0) && (index < Length))
            Console.WriteLine(a[index]);
        else Console.WriteLine("Ошибка в отображении данных");
    }
}